--------------------------------------------------------------------------------
-- File: list_marquage_accessible.ads
--------------------------------------------------------------------------------
with marquage_accessible ;
with Matrices ;

package list_marquage_accessible is

   maxTabMA  : Integer := 50;

   type ListMarquage is array (1..maxTabMA) of marquage_accessible.MarquageAccessible;


   --Initialise la liste
   procedure Initialise        (listMarq : in out ListMarquage; indiceCourant : in out Integer; marqAcc : marquage_accessible.MarquageAccessible);

   -- Ajoute à la tete de la liste
   procedure add               (listMarq : in out ListMarquage; indiceCourant : in out Integer; marquage : in marquage_accessible.Marquage; iterator : in Integer) ;

   -- Donne la tete de la liste
   function  getTete           (listMarq : in ListMarquage; indiceCourant : in Integer) return marquage_accessible.Marquage ;

   -- Test si le marquage est franchissable
   function  estFranchissable  (iterator : in integer; marquage : in marquage_accessible.Marquage; matIM : in Matrices.Matrice) return Boolean ;

   -- Test si le marquage est dans la liste
   function  contains          (listMarq : in ListMarquage; indiceCourant : in Integer; marquage : in marquage_accessible.Marquage) return Integer ;

   -- Test si le marquage a un multiple dans la liste
   procedure  containsMultiple  (listMarq : in ListMarquage; indiceCourant : in Integer; marquage : in out marquage_accessible.Marquage);

   -- Renvoi le marquage genere par le franchissement
   function  getFranchissement (iterator : in integer; marquage : in marquage_accessible.Marquage; matIM : in Matrices.Matrice; matIP : in Matrices.Matrice) return marquage_accessible.Marquage ;

   -- Algorithme de generation de Graphe de Marquage Accessible
   procedure construire        (listMarq : in out ListMarquage; indiceCourant : in out Integer; matIM : in Matrices.Matrice; matIP : in Matrices.Matrice);

   -- Ajoute une reference dans le tableau suivant
   procedure addSuivant        (listMarq : in out ListMarquage; indiceCourant : in Integer; indiceMarqSuiv : in Integer; indiceTransition : in Integer);

   -- Test si le reseau est borne
   function    estBorne        (lMarq : in ListMarquage; nbCourant : in integer) return boolean;

   -- Test si le reseau est quasi-vivant
   function    estQuasiVivant  (lMarq : in ListMarquage; nbCourant : in integer; nbTransitions : in integer) return boolean;

   -- Test si le reseau est vivant
   function    estVivant  (lMarq : in ListMarquage; nbCourant : in integer; nbTransitions : in integer) return boolean;

   -- Test si le reseau est sans blocage
   function    estSansBlocage  (lMarq : in ListMarquage; nbCourant : in integer; nbTransitions : in integer) return boolean;

   -- Affiche la liste des marquages accessibles
   procedure Put (lMarq : in ListMarquage; nbCourant : in integer) ;

end list_marquage_accessible;
